home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / monitory / asktask / asktask.c < prev    next >
C/C++ Source or Header  |  1989-07-22  |  8KB  |  249 lines

  1. /* asktask.c */
  2. /*************************************************************************
  3.  ***                    ASK TASK - EXAMINES EXEC TASKS                 ***
  4.  *** Date begun: 31/3/89.                                              ***
  5.  *** Last modified: 2/4/89.                                            ***
  6.  ***                23/4/89 - added line to start from WB without con: ***
  7.  *************************************************************************/
  8.  
  9. int     noWBcons = 1;       /* This is it! */
  10.  
  11. #include "asktask.h"
  12.  
  13. struct GfxBase          *GfxBase;
  14. struct IntuitionBase    *IntuitionBase;
  15. struct ExecBase         *ExBase;
  16. struct Window           *Window;
  17. struct NewWindow        NewWindow = {
  18.     0,0,640,145,0,1,RAWKEY|MOUSEBUTTONS|CLOSEWINDOW|GADGETUP,
  19.     WINDOWDEPTH|WINDOWCLOSE|WINDOWDRAG|SMART_REFRESH|ACTIVATE,
  20.     NULL,NULL,"AskTask - JJB TEMPLAR",NULL,NULL,0,0,0,0,WBENCHSCREEN};
  21.  
  22. struct  Task    *task[NUM_TASKS];
  23. char            tnames[NUM_TASKS*TNAMESIZE];
  24. char            *tnp[NUM_TASKS];
  25. int             numtasks,page,ct;
  26.  
  27. char    *notaskerror = "But there's no task! What are you trying to do?";
  28.  
  29. char        mypri;
  30. struct Task *me;
  31. int         mycolors;
  32. UWORD       cmap[4] = {0x000,0x455,0x999,0x600};
  33. UWORD       tmap[4];
  34.  
  35. extern struct Gadget *firstgadg;
  36.  
  37. extern void help();
  38. extern void about();
  39. extern void input(struct Window *,char *,char *,char *,int,int,int,int,int);
  40. extern void rmv();
  41. extern void kill();
  42. extern unsigned long bitsput(char *);
  43. extern void putbits(char *,unsigned long);
  44. extern void prevpage();
  45. extern void nextpage();
  46. extern void puttname(int,int);
  47. extern void puttasks();
  48. extern void puttaskdata();
  49. extern void setupwindow();
  50. extern void putmessage(char *,int);
  51. extern char getchfromw();
  52. extern int  yesno();
  53. extern void setsignal();
  54. extern void changepri();
  55.  
  56. void    gettasks();
  57. void    cleanup(int);
  58. void    doclick(short,short);
  59.  
  60. void    gettasks() /*====================================================*/
  61. {
  62. int     i,j;
  63. struct  Task *tp,**th;
  64.     j = i = 0;
  65.     Disable();
  66.     th = (struct Task **)(ExBase->TaskReady.lh_Head);
  67.     tp = *th;
  68.     while (tp && (j < NUM_TASKS)) {
  69.         task[j] = tp;
  70.         strcpy(&tnames[i],tp->tc_Node.ln_Name);
  71.         tnp[j] = &tnames[i];
  72.         i += strlen(tnp[j]) + 1;
  73.         j++;
  74.         tp = (struct Task *)(tp->tc_Node.ln_Succ);
  75.     }
  76.     th = (struct Task **)(ExBase->TaskWait.lh_Head);
  77.     tp = *th;
  78.     while (tp && (j < NUM_TASKS)) {
  79.         task[j] = tp;
  80.         strcpy(&tnames[i],tp->tc_Node.ln_Name);
  81.         tnp[j] = &tnames[i];
  82.         i += strlen(tnp[j]) + 1;
  83.         j++;
  84.         tp = (struct Task *)(tp->tc_Node.ln_Succ);
  85.     }
  86.     Enable();
  87.     numtasks = j;
  88.     page = 0;   ct = -1;
  89. }
  90.  
  91. void    doclick(x,y) /*==================================================*/
  92. short   x,y;
  93. {
  94.     putmessage("",1);
  95.     if ((x >= 2) && (x <= 165)) {
  96.         if ((y < 21) || (y > 132)) return;
  97.         y -= 21;
  98.         y = (page * 14) + (y / 8);
  99.         if (y >= numtasks) return;
  100.         ct = y;
  101.         puttaskdata();
  102.         if (!tnp[y][0]) putmessage("WARNING: nameless tasks are dubious!",3);
  103.     }
  104.     else if ((x >= 168) && (x <= 471)) {
  105.         if ((y < 10) || (y > 132)) return;
  106.         puttaskdata();
  107.     }
  108. }
  109.  
  110. void    main(argc,argv) /*===============================================*/
  111. int     argc;
  112. char    *argv[];
  113. {
  114. struct IntuiMessage *msg,m;
  115. struct Gadget       *gp;
  116. int         event,j;
  117. long        *hook;
  118.  
  119.     /* My default running priority is 15 */
  120.     mypri = 15;     mycolors = 0;
  121.     j = 1;
  122.     while (j < argc) {
  123.         if (argv[j][0] == '?') {
  124.             printf("
  125. [32m
  126. [1m
  127. [3mAskTask
  128. [0m by 
  129. [33m
  130. [42m-+- JJB TEMPLAR -+-
  131. [0m for examining task data.\n");
  132.             printf("USAGE: %s [<-opt>]\n",argv[0]);
  133.             printf("    where opt = c       - use intended (my) colors.\n");
  134.             printf("                p{n}    - set asktask priority to n.\n");
  135.             printf("    NOTE: [] = optional, <> = 1 or more, {} = mandatory.\n");
  136.             exit(0);
  137.         }
  138.         if (argv[j][0] == '-') {
  139.             switch (argv[j][1]) {
  140.                 case ('c'): mycolors = 1; break;
  141.                 case ('p'): sscanf(&argv[j][2],"%d",&mypri); break;
  142.                 default: printf("WARNING: unknown option: %s\n",&argv[j][1]);
  143.             }
  144.         }
  145.         else printf("WARNING: unknown option: %s\n",argv[j]);
  146.         j++;
  147.     }
  148.     me = (struct Task *)FindTask(NULL);
  149.     if (me->tc_Node.ln_Pri < mypri) SetTaskPri(me,mypri);
  150.  
  151.     hook = (long *)0x4L;
  152.     ExBase = (struct ExecBase *)*hook;
  153.  
  154.     if (!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L))) {
  155.         printf("ERROR: unable to open graphics.library!\n");
  156.         cleanup(0);
  157.     }
  158.     if (!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0L))) {
  159.         printf("ERROR: unable to open intuition.library!\n");
  160.         cleanup(1);
  161.     }
  162.     NewWindow.FirstGadget = firstgadg;
  163.     if (!(Window = (struct Window *)OpenWindow(&NewWindow))) {
  164.         printf("ERROR: unable to open window!\n");
  165.         cleanup(2);
  166.     }
  167.  
  168.     if (mycolors) {
  169.         for (j = 0; j < 4; j++)
  170.             tmap[j] = GetRGB4(Window->WScreen->ViewPort.ColorMap,j);
  171.         LoadRGB4(&(Window->WScreen->ViewPort),cmap,4);
  172.     }
  173.  
  174.     setupwindow();      /* Draw boxes and things */
  175.  
  176.     gettasks();
  177.     puttasks();
  178.     puttaskdata();
  179.     putmessage("Welcome to AskTask...  (version dated 2/4/89)",1);
  180.  
  181.     event = 1;
  182.     while (event) {
  183.         Wait(1<<Window->UserPort->mp_SigBit);
  184.         while (msg = (struct IntuiMessage *)GetMsg(Window->UserPort)) {
  185.             m = *msg;
  186.             ReplyMsg((struct Message *)msg);
  187.             switch (m.Class) {
  188.                 case (CLOSEWINDOW): event = 0;  break;
  189.                 case (RAWKEY): switch (m.Code) {
  190.                     case (0x45): event = 0;     break;  /* ESC */
  191.                     case (0x50): gettasks();            /* F1 */
  192.                                  puttasks();
  193.                                  puttaskdata();
  194.                                  putmessage("[Task data refreshed]",1);
  195.                                  break;
  196.                     case (0x51): puttaskdata(); break;  /* F2 */
  197.                     case (0x54): kill();        break;  /* F5 */
  198.                     case (0x55): rmv();         break;  /* F6 */
  199.                     case (0x56): setsignal();   break;  /* F7 */
  200.                     case (0x57): changepri();   break;  /* F8 */
  201.                     case (0x59): about();       break;  /* F10 */
  202.                     case (0x4c): prevpage();    break;  /* CSR UP */
  203.                     case (0x4d): nextpage();    break;  /* CSR DN */
  204.                     case (0x5f): help();        break;  /* HELP */
  205.                 }
  206.                 break;
  207.                 case (MOUSEBUTTONS):
  208.                     if (m.Code == SELECTDOWN) doclick(m.MouseX,m.MouseY);
  209.                     break;
  210.                 case (GADGETUP): gp = (struct Gadget *)msg->IAddress;
  211.                 switch (gp->GadgetID) {
  212.                     case (G_QUIT):     event = 0;   break;
  213.                     case (G_HELP):     help();      break;
  214.                     case (G_NEXTPAGE): nextpage();  break;
  215.                     case (G_PREVPAGE): prevpage();  break;
  216.                     case (G_SETSIG):   setsignal(); break;
  217.                     case (G_CHANGE_P): changepri(); break;
  218.                     case (G_REF_TASK): puttaskdata(); break;
  219.                     case (G_EXITTASK): kill();      break;
  220.                     case (G_REMOVE):   rmv();       break;
  221.                     case (G_REFRESH):  gettasks();
  222.                                        puttasks();
  223.                                        puttaskdata();
  224.                                        putmessage("[Task data refreshed]",1);
  225.                                        break;
  226.                 }
  227.                 break;
  228.                 default: putmessage("Unused input!",1);
  229.             }
  230.         }
  231.     }
  232.  
  233.     cleanup(ENDNORMAL);
  234. }
  235.  
  236. void    cleanup(n) /*====================================================*/
  237. int     n;
  238. {
  239.     switch (n) {
  240.         case (3): if (mycolors) LoadRGB4(&(Window->WScreen->ViewPort),tmap,4);
  241.                   CloseWindow(Window);
  242.         case (2): CloseLibrary(IntuitionBase);
  243.         case (1): CloseLibrary(GfxBase);
  244.         case (0): break;
  245.         default: printf("Error in cleanup call - parameter = %d\n",n);
  246.     }
  247.     exit(0);
  248. }
  249.